package mx.itesm.rmroman.proyectojuegomavi;

import org.andengine.engine.camera.Camera;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.scene.background.SpriteBackground;
import org.andengine.entity.scene.menu.MenuScene;
import org.andengine.entity.scene.menu.item.IMenuItem;
import org.andengine.entity.scene.menu.item.SpriteMenuItem;
import org.andengine.entity.scene.menu.item.decorator.ScaleMenuItemDecorator;
import org.andengine.entity.sprite.ButtonSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.opengl.util.GLState;

/**
 * Representa la escena con las opciones del menú principal
 *
 * @author Roberto Martínez Román
 */
public class EscenaMenu extends EscenaBase
{
    // *** Fondo
    private Sprite spriteFondo; //(el fondo de la escena, estático)

    // *** Botones del menú
    private ButtonSprite btnAcercaDe;
    private ButtonSprite btnJugar;

    // *** Un menú de tipo SceneMenu
    private MenuScene menu;     // Reemplaza a los botones individuales
    private final int OPCION_ACERCA_DE = 0;
    private final int OPCION_JUGAR = 1;
    private final int OPCION_JUGAR_DOS = 2;
    private static final int OPCION_FISICA = 3;


    @Override
    public void crearEscena() {
        // Creamos el sprite de manera óptima
        spriteFondo = new Sprite(0,0, admRecursos.regionFondoMenu,admRecursos.vbom) {
            @Override
            protected void preDraw(GLState pGLState, Camera pCamera) {
                super.preDraw(pGLState, pCamera);
                pGLState.enableDither();
            }
        };
        // Configuración de la imagen
        spriteFondo.setPosition(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2);

        // Crea el fondo de la pantalla
        SpriteBackground fondo = new SpriteBackground(0,0,0,spriteFondo);
        setBackground(fondo);
        setBackgroundEnabled(true);

        // *** Otra forma de mostrar opciones de menú
        agregarMenu();
    }

    private void agregarMenu() {
        // Crea el objeto que representa el menú
        menu = new MenuScene(admRecursos.camara);
        // Centrado en la pantalla
        menu.setPosition(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2);
        // Crea las opciones (por ahora, acerca de y jugar)
        final IMenuItem opcionAcercaDe = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_ACERCA_DE,
                admRecursos.regionBotonAcercaDe,admRecursos.vbom), 1.5f, 1);
        final IMenuItem opcionJugar = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_JUGAR,
                admRecursos.regionBotonJugar,admRecursos.vbom),1.5f,1);
        // Otra opción, jugar Dos
        final IMenuItem opcionJugarDos = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_JUGAR_DOS,
                admRecursos.regionBotonJugarDos,admRecursos.vbom),1.5f,1);
        // Otra opción, escena con física
        final IMenuItem opcionFisica = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_FISICA,
                admRecursos.regionBotonFisica,admRecursos.vbom),1.5f,1);

        // Agrega las opciones al menú
        menu.addMenuItem(opcionAcercaDe);
        menu.addMenuItem(opcionJugar);
        menu.addMenuItem(opcionJugarDos);
        menu.addMenuItem(opcionFisica);
        // Termina la configuración
        menu.buildAnimations();
        menu.setBackgroundEnabled(false);
        // Ubicar las opciones DENTRO del menú. El centro del menú es (0,0)
        opcionAcercaDe.setPosition(-150, 0);
        opcionJugar.setPosition(150, 0);
        opcionJugarDos.setPosition(0,-150);
        opcionFisica.setPosition(0,150);
        // Registra el Listener para atender las opciones
        menu.setOnMenuItemClickListener(new MenuScene.IOnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem,
                                             float pMenuItemLocalX, float pMenuItemLocalY) {
                // El parámetro pMenuItem indica la opcion oprimida
                switch(pMenuItem.getID()) {
                    case OPCION_ACERCA_DE:
                        // Mostrar la escena de AcercaDe
                        admEscenas.crearEscenaAcercaDe();
                        admEscenas.setEscena(TipoEscena.ESCENA_ACERCA_DE);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_JUGAR_DOS:
                        // Mostrar la escena del Juego Dos
                        admEscenas.crearEscenaJuegoDos();
                        admEscenas.setEscena(TipoEscena.ESCENA_JUEGO_DOS);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_JUGAR:
                        // Mostrar la pantalla de juego
                        admEscenas.crearEscenaJuego();
                        admEscenas.setEscena(TipoEscena.ESCENA_JUEGO);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_FISICA:
                        // Mostrar la pantalla de juego
                        admEscenas.crearEscenaFisica();
                        admEscenas.setEscena(TipoEscena.ESCENA_FISICA);
                        admEscenas.liberarEscenaMenu();
                        break;
                    default:
                        return false;
                }
                return true;
            }
        });

        // Asigna este menú a la escena
        setChildScene(menu);
    }

    @Override
    public void onBackKeyPressed() {
        // Salir del juego
    }

    @Override
    public TipoEscena getTipoEscena() {
        return TipoEscena.ESCENA_MENU;
    }

    @Override
    public void liberarEscena() {
        this.detachSelf();      // La escena se deconecta del engine
        this.dispose();         // Libera la memoria
    }
}
